package com.sinothk.hussars.utils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

public class ClassUtil {

    /**
     * 通过public的 get set方法进行复制，适合用于父类转换成子类
     *
     * @param objSource
     * @param clazzSrc
     * @param clazzDes
     * @return
     */
    public <T, K> T copyByMethod(K objSource, Class<K> clazzSrc, Class<T> clazzDes) {

        if (null == objSource) return null;//如果源对象为空，则直接返回null

        T objDes = null;
        try {
            objDes = clazzDes.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }

        return mergeByPublicMethod(objSource, objDes, clazzSrc, clazzDes);

    }

    private  <T, K> T mergeByPublicMethod(K objSource, T objDes, Class<K> clazzSrc, Class<T> clazzDes) {

        if (null == objSource) return null;//如果源对象为空，则直接返回null

        //获取目标对象的所有属性
        Method[] methodDeses = clazzDes.getMethods();
        Map<String, Method> m = new HashMap<String, Method>();
        // 循环遍历方法，获取set方法
        for (Method method : methodDeses) {
            //如果不是set方法则跳过
            if (!method.getName().startsWith("set")) continue;
            m.put(method.getName().substring(3), method);

        }


        // 获得源对象所有方法
        Method[] sourceMethods = clazzSrc.getMethods();
        // 循环遍方法
        for (Method method : sourceMethods) {
            //如果是set方法则跳过
            if (!method.getName().startsWith("get")) continue;
            //如果目标对象不存在该方法，则跳过
            if (!m.containsKey(method.getName().substring(3))) continue;

            try {
                m.get(method.getName().substring(3)).invoke(objDes, method.invoke(objSource));
            } catch (IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
            }
        }
        return objDes;

    }

}
